package lth.springboot.rabbitmq.config;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * @description: 配置 confirm and return 需要实现 RabbitTemplate 内部类 ConfirmCallback，ReturnCallback
 *               注意该类只能用 @Component，不能用 @Configuration
 * @author:刘腾辉
 * @create:2020/10/20 17:32
 */
@Component
public class ConfirmAndReturnConfig implements RabbitTemplate.ConfirmCallback,RabbitTemplate.ReturnCallback {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostConstruct //该注解表示在创建 ConfirmAndReturnConfig 对象的时候回去执行 @PostConstruct 下的方法，相当于 spring 的 init-method
    public void initMethod(){
        /**
         * 这里传入 this 就代表会执行重写的方法 confirm 和 returnedMessage
         */
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnCallback(this);
    }

    /**
     * @param correlationData
     * @param ack 消息成功到达 exchange 是返回 true
     * @param cause
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        if (ack) {
            System.out.println("消息到达了 exchange");
        }else {
            System.out.println("消息未到达了 exchange");
        }

    }

    /**
     * 消息没有成功到达 queue 的时候回调
     * @param message
     * @param replyCode
     * @param replyText
     * @param exchange
     * @param routingKey
     */
    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        System.out.println("消息未到达 queue");
    }
}
